package consul

import (
	"gm-consul/pkg/config"
	"gm-consul/pkg/log"
	"os"

	"github.com/hashicorp/consul/api"
)

var kvmap = make(map[string]string)

// 初始化配置文件
func InitRules() {
	prefix := config.GetConfig().Prefix
	// 创建文件夹
	os.MkdirAll(prefix, 0777)

	//读取目录下所有yaml文件
	files, err := os.ReadDir(prefix)
	if err != nil {
		log.Fatal(err.Error())
	}
	for _, f := range files {
		if f.IsDir() {
			continue
		}
		//获取key
		key := f.Name()
		//读取文件内容
		content, err := os.ReadFile(prefix + key)
		if err != nil {
			log.Fatal(err.Error())
		}
		kvmap[key] = string(content)
	}
}

// 同步consul kv到本地
func SyncConsulKVToLocal(config config.Config) {
	// 创建一个默认的 Consul 客户端配置
	conf := api.DefaultConfig()
	conf.Address = config.Consul.Address
	if condition := config.Consul.Token; condition != "" {
		conf.Token = config.Consul.Token
	}
	prefix := config.Prefix

	// 创建客户端
	client, err := api.NewClient(conf)
	if err != nil {
		log.Error("错误：无法创建 Consul 客户端:" + err.Error())
	}
	// 获取 KV 存储的值
	kv := client.KV()
	pair, _, err := kv.List(prefix, nil)
	if err != nil {
		log.Error("无法获取 KV 值, 错误信息: " + err.Error())
		return
	}

	if pair != nil {
		for _, p := range pair {
			if p.Key == prefix {
				continue
			}

			//获取key
			key := p.Key[len(prefix):]

			//判断是否有更新
			if kvmap[key] == string(p.Value) {
				log.Debug(key + " 未更新")
				continue
			}

			//写入文件
			f, err := os.Create("prometheus/rules/" + key)
			if err != nil {
				log.Error("写入文件失败, 错误信息: " + err.Error())
			}
			defer f.Close()
			f.Write(p.Value)

			kvmap[key] = string(p.Value)
			log.Debug(key + " 更新成功")
		}
	} else {
		log.Debug("未找到该键的值")
	}
}
